﻿#ifndef __AF_MOVEACT_H__
#define __AF_MOVEACT_H__

namespace AF
{
	struct MoveEffect;
	//class Animation -* Runnable
		//class Action
			class MoveAction;
}
typedef AF::MoveEffect		AF_SMoveEffect;
typedef AF::MoveAction		AF_CMoveAction;

#include "AF_Action.h"

#define AF_MA_MODE_ONCE		0	// 一次
#define	AF_MA_MODE_AGAIN	1	// 重复
#define	AF_MA_MODE_RETURN	2	// 返复

namespace AF
{
	/// 移动动作目标效果结构
	struct MoveEffect
	{
		/// 移动是否从当前位置点开始
		bool		isHasCurPos;	// true,		是否包含当前位置点
		/// 移动关键路径点
		Point*		atPaths;	// NULL,		移动关键路径点
		/// 关键路径点数量
		int		nPathNum;	// 0,			关键路径点数量
		/// 移动模式
		int		nMode;		// AF_MA_MODE_ONCE,	运动模式
		/// 移动重复次数
		int		nTimes;		// 1,			运动次数

		MoveEffect()
		{
			isHasCurPos = true;
			atPaths = NULL;
			nPathNum = 0;
			nMode = AF_MA_MODE_ONCE;
			nTimes = 1;
		}
	};

	/// 移动动作类
	class MoveAction : public Action
	{
	public:
		MoveAction();
		~MoveAction();

	public:
		void		SetEffect(Pointer pEffect);
		/// 快捷方式，移动到某一点
		void		MoveTo(Point at);
		/// 快捷方式，移动到某一点
		void		MoveTo(int nX, int nY);
		/// 快捷方式，再次移动
		void		MoveAgain();

		/// 移动动作更新是否依赖画面更新
		void		AtFPS(bool isAtFPS = true);
	protected:
		bool		OnPlay(Bundle* pParam);
		bool		OnUpdate();
		bool		OnStop();

	protected:
		/// 当将要移动时
		virtual	bool	OnMoveAct()
				{return true;}

	private:
		int		Move();
		void		CreatPathLine();
		int		CreatLine(Point& atStart, Point& atEnd, Point* patLine = NULL);

	public:
		/// 速度属性
		DIM_ATTRIB(UINT, Speed);		// 单位：像素/秒 & 像素/更新
		/// 加速度属性
		DIM_ATTRIB(int, AddSpeed);		// 单位：像素/秒 & 像素/更新
		/// 最大速度属性
		DIM_ATTRIB(UINT, MaxSpeed);		// 单位：像素/秒 & 像素/更新

	private:
		MoveEffect	m_Effect;
		UINT		m_nSpeed;	// 当前速度	单位：像素/秒 & 像素/更新
// 		int		m_nGravity;	// 重力
		int		m_nTimes;	// 次数
		int		m_nWay;		// 正方向

	private:
		bool		m_isAtFPS;	// 移动是否依赖画面更新
		TimeTicks	m_ttLast;	// 上次移动时间
		float		m_fRemanent;	// 剩余部分

		bool		m_isAgain;	// 再一次

		Point*		m_atPath;	// 移动路径
		UINT		m_nPathLen;	// 路径长度
		int		m_nCur;		// 当前所在路径位置
	};
}
#endif